#ifndef __ClefPrivee
#define __ClefPrivee

#include "ClefPublique.h"

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include <string.h>
#include <glib-2.0/glib.h>
#include <assert.h>

struct sClefPrivee
{
    mpz_t u;
    mpz_t n;
};
typedef struct sClefPrivee ClefPrivee;

/** @brief Initialise une clef privee*/
void ClefPriveeInitialiser(ClefPrivee **pClef);

/** @brief Retourne le premier champ d'une structure ClefPrivee */
mpz_ptr ClefPriveeGetu(ClefPrivee *pClef);

/** @brief Retourne le premier champ d'une structure ClefPrivee en interdisant toutes modifications*/
const mpz_ptr ClefPriveeGetu2(const ClefPrivee *pClef);

/** @brief Modifie le premier champ d'une structure ClefPrivee*/
void ClefPriveeSetu(ClefPrivee *pClef, const mpz_t u1);

/** @brief Retourne le deuxième champ d'une structure ClefPrivee*/
mpz_ptr ClefPriveeGetn(ClefPrivee *pClef);

/** @brief Retourne le deuxième champ d'une structure ClefPrivee en interdisant toutes modifications */
const mpz_ptr ClefPriveeGetn2(const ClefPrivee *pClef);

/** @brief Modifie le deuxième champ d'une structure ClefPrivee*/
void ClefPriveeSetn(ClefPrivee *pClef, const mpz_t n1);

/** @brief Genère une clef privee */
ClefPrivee * ClefPriveeGenerer(ClefPublique * pClefPublique);

/** @brief Affiche la clef privee */
void ClefPriveeAfficher(const ClefPrivee * pClefPrivee);

/** @brief Libère une structure ClefPrivee */
void ClefPriveeLiberer(ClefPrivee * pClefPrivee);

/** @brief Test le module clef privee */
void testRegressionClefPrivee();

#endif
